package com.building.hcrm.common;

import java.lang.Thread.UncaughtExceptionHandler;

import com.building.hcrm.HcrmApplication;
import com.building.hcrm.ui.LoadingActivity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Looper;
import android.util.Log;
import android.widget.Toast;

/**
 * UncaughtException处理类,当程序发生Uncaught异常的时候,有该类来接管程序,并记录发送错误报告.
 * 
 * @author user
 */
public class CrashHandler implements UncaughtExceptionHandler
{
	private final String LTAG = CrashHandler.class.getSimpleName();
	// 系统默认的UncaughtException处理类
	private Thread.UncaughtExceptionHandler mDefaultHandler;
	// CrashHandler实例
	private static CrashHandler INSTANCE = new CrashHandler();
	// 程序的Context对象
	private Context mContext;

	/** 保证只有一个CrashHandler实例 */
	private CrashHandler()
	{
	}

	/** 获取CrashHandler实例 ,单例模式 */
	public static CrashHandler getInstance()
	{
		return INSTANCE;
	}

	/**
	 * 初始化
	 * 
	 * @param context
	 */
	public void init(Context context)
	{
		mContext = context;
		// 获取系统默认的UncaughtException处理器
		mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
		// 设置该CrashHandler为程序的默认处理器
		Thread.setDefaultUncaughtExceptionHandler(this);
	}

	/**
	 * 当UncaughtException发生时会转入该函数来处理
	 */
	@Override
	public void uncaughtException(Thread thread, Throwable ex)
	{
		if (!handleException(ex) && mDefaultHandler != null)
		{
			// 如果用户没有处理则让系统默认的异常处理器来处理
			mDefaultHandler.uncaughtException(thread, ex);
		}
		else
		{
			try
			{
				Thread.sleep(3000);
			}
			catch (InterruptedException e)
			{
				Log.e(LTAG, ComFunc.getExceptionMessage(e), e);
			}

			Intent intent = new Intent(mContext, LoadingActivity.class);
			PendingIntent restartIntent = PendingIntent.getActivity(mContext, 0, intent,
					Intent.FLAG_ACTIVITY_NEW_TASK);

			AlarmManager mgr = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
			mgr.set(AlarmManager.RTC, System.currentTimeMillis()+500, restartIntent);//0.5秒后重启
			((HcrmApplication)mContext).finishActivity();
			
			android.os.Process.killProcess(android.os.Process.myPid()); //为了应用重启，先杀死异常进程
		}
	}

	/**
	 * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
	 * 
	 * @param ex
	 * @return true:如果处理了该异常信息;否则返回false.
	 */
	private boolean handleException(Throwable ex)
	{
		if (ex == null)
		{
			return false;
		}
		// 使用Toast来显示异常信息
		new Thread()
		{
			@Override
			public void run()
			{
				Looper.prepare();
				Toast.makeText(mContext, "很抱歉,程序出现异常,即将退出.", Toast.LENGTH_LONG).show();
				Looper.loop();
			}
		}.start();

		return true;
	}
}